package dao;

import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.List;
import java.util.StringTokenizer;
import negocio.busqueda.BusquedaVocabulario;
import negocio.Posteo;
import negocio.Vocabulario;
import org.hibernate.classic.Session;

public class DAOVocabulario {

    public static Hashtable<String, Vocabulario> hashVocabulario;

    public static void armarHashVocabulario() {
        if (hashVocabulario == null) {
            hashVocabulario = new Hashtable<String, Vocabulario>();
            String query = "FROM negocio.Vocabulario";
            List<Vocabulario> resultado = Hibernate.getSession().find(query);
            for (Vocabulario vocabulario : resultado) {
                hashVocabulario.put(vocabulario.getPalabra(), vocabulario);
            }
            //Hibernate.getSession().close();
        }
    }

    public static void saveOrUpdateHashVocabulario() {
        Hibernate.getSession();
        Enumeration<String> palabras = hashVocabulario.keys();
        while (palabras.hasMoreElements()) {
            String palabra = palabras.nextElement();
            Vocabulario vocabulario = hashVocabulario.get(palabra);
            if (vocabulario != null && vocabulario.getCantidadDocumentos() > 0 
                    && !vocabulario.getListaPosteo().isEmpty()
                    && vocabulario.getPalabra() != null) {
                for (Posteo posteo : vocabulario.getListaPosteo()) {
                    if (posteo.getDocumento() != null && posteo.getFrecuencia() > 0 ) {
                        System.out.println("Guardando posteo: ");
                        System.out.println("titulo: " + posteo.getDocumento().getTitulo());
                        System.out.println("del vocabulario: " + vocabulario.getPalabra());
                        DAOPosteo.guardarPosteo(posteo);
                    }
                }

                Hibernate.saveOrUpdateObjeto(vocabulario);
            }
        }
    }

    public static List<Vocabulario> find(String palabra) {
        Session session = Hibernate.getSessionFactory().openSession();
        String qry = "FROM negocio.Vocabulario WHERE palabra LIKE '"+palabra+"'";
        List<Vocabulario> resultado =  session.find(qry);
        //session.close();
        return resultado;
    }

    public static List<Vocabulario> findSubString(String palabra) {
        Session session = Hibernate.getSessionFactory().openSession();
        String qry = "FROM negocio.Vocabulario WHERE palabra LIKE '%"+palabra+"%'";
        List<Vocabulario> resultado =  session.find(qry);
        for (Vocabulario vocabulario : resultado) {
            if (vocabulario.getPalabra().equals(palabra)) {
                resultado.remove(vocabulario);
                break;
            }
        }
        //session.close();
        return resultado;
    }

    public static List<BusquedaVocabulario> obtenerConsultaBusquedaOrdenadaPorNr(String consultaBusqueda) {
        //divide el texto en palabras
        StringTokenizer palabrasBusqueda = new StringTokenizer(consultaBusqueda);

        List<BusquedaVocabulario> consultaOrdenada = new ArrayList<BusquedaVocabulario>();

        //por cada palabra
        while (palabrasBusqueda.hasMoreElements()) {
            String palabraBusqueda = palabrasBusqueda.nextElement().toString();
            List<Vocabulario> vocabulariosExactos = find(palabraBusqueda);
            if (vocabulariosExactos != null && !vocabulariosExactos.isEmpty()) {
                for (Vocabulario vocabulario : vocabulariosExactos) {
                    BusquedaVocabulario busquedaVocabulario = new BusquedaVocabulario();
                    busquedaVocabulario.setVocabulario(vocabulario);
                    busquedaVocabulario.setExacto(true);
                    consultaOrdenada.add(busquedaVocabulario);
                }
            }
            List<Vocabulario> vocabulariosSubString = findSubString(palabraBusqueda);
            if (vocabulariosSubString != null && !vocabulariosSubString.isEmpty()) {
                for (Vocabulario vocabulario : vocabulariosSubString) {
                    BusquedaVocabulario busquedaVocabulario = new BusquedaVocabulario();
                    busquedaVocabulario.setVocabulario(vocabulario);
                    busquedaVocabulario.setSubString(true);
                    consultaOrdenada.add(busquedaVocabulario);
                }
            }
        }

        return consultaOrdenada;
    }


    static {
        armarHashVocabulario();
    }

}
